{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "MNIST Dataset in Keras.ipynb",
      "provenance": [],
      "collapsed_sections": [
        "zgUykL92DwRP",
        "VyhqBvA3hMNJ",
        "a3fzyltQg8aC",
        "WAhsOhJLKLQz",
        "Orpjq104avfu",
        "VgGDtkuUdFnJ",
        "KVA5UBgRX328"
      ]
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "O-zE0qRLEojg",
        "colab_type": "text"
      },
      "source": [
        "# Steps\n",
        "\n",
        "1. Import Required Libraries\n",
        "2. Load the data\n",
        "3. Preprocess the Data\n",
        "4. Define the Model\n",
        "5. Compile the Model\n",
        "6. Fit the Model\n",
        "7. Evaluate"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zgUykL92DwRP",
        "colab_type": "text"
      },
      "source": [
        "# Importing the required libraries"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8REFAXoaHDyt",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 74
        },
        "outputId": "5b047b96-7dae-4fd9-9761-078f525ad7c1"
      },
      "source": [
        "# Helper Libraries\n",
        "\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
            "  import pandas.util.testing as tm\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TrgfD9xFDjzN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "f95144f5-eebf-4f1f-83f9-0e4d57042e96"
      },
      "source": [
        "# TensorFlow and tf.keras\n",
        "\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "\n",
        "print(tf.__version__)\n",
        "\n",
        "print(keras.__version__)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2.3.0\n",
            "2.4.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DNwSvHEFjbCV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from keras.utils import np_utils\n",
        "from keras.models import Sequential \n",
        "from keras.layers import Dense, Dropout, BatchNormalization, Flatten"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iNSzif91D_jp",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from keras.datasets import mnist"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VyhqBvA3hMNJ",
        "colab_type": "text"
      },
      "source": [
        "# Load and Explore the Data"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s3Iy3-yeGoIh",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "6685990b-cca8-436b-cf11-a0f075647659"
      },
      "source": [
        "# the data, shuffled and split between train and test sets \n",
        "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
            "11493376/11490434 [==============================] - 0s 0us/step\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OKW_AjhfL9Y4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "eb5182f7-940a-4139-887e-d89425ef3242"
      },
      "source": [
        "X_train.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 28, 28)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NYchz8q6F8LZ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "716ce54f-26a4-4af7-b523-dfba38d9f4d3"
      },
      "source": [
        "print(\"Number of training examples :\", X_train.shape[0], \"and each image is of shape (%d, %d)\"%(X_train.shape[1], X_train.shape[2]))\n",
        "print(\"Number of test examples :\", X_test.shape[0], \"and each image is of shape (%d, %d)\"%(X_test.shape[1], X_test.shape[2]))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Number of training examples : 60000 and each image is of shape (28, 28)\n",
            "Number of test examples : 10000 and each image is of shape (28, 28)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rHTm6CpRGAKX",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "c87a6e31-cda9-4b7e-df19-dc6188b85d93"
      },
      "source": [
        "# An example data point\n",
        "print(X_train[0])"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136\n",
            "  175  26 166 255 247 127   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253\n",
            "  225 172 253 242 195  64   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251\n",
            "   93  82  82  56  39   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119\n",
            "   25   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253\n",
            "  150  27   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252\n",
            "  253 187   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249\n",
            "  253 249  64   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253\n",
            "  253 207   2   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253\n",
            "  250 182   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201\n",
            "   78   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]\n",
            " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
            "    0   0   0   0   0   0   0   0   0   0]]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "zqqCMCP7G3Pa",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 716
        },
        "outputId": "f8376d9a-971e-4ca1-f705-dc6d33631eb3"
      },
      "source": [
        "plt.figure(figsize=(12, 12))\n",
        "np.random.seed(0)\n",
        "idx = np.random.randint(0, 60000, 9)\n",
        "\n",
        "for i in range(len(idx)):\n",
        "    plt.subplot(3, 3, i+1)\n",
        "    plt.title(y_train[idx[i]])\n",
        "    grid_data = np.reshape(X_train[idx[i]], (28,28))\n",
        "    plt.imshow(grid_data, cmap='gray')\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 864x864 with 9 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a3fzyltQg8aC",
        "colab_type": "text"
      },
      "source": [
        "# Data Preprocessing"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "kx_Ddr6lHdPY",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# if we observe the above matrix each cell is having a value between 0-255\n",
        "# before we move to apply machine learning algorithms lets try to normalize the data\n",
        "# X => (X - Xmin)/(Xmax-Xmin) = X/255\n",
        "\n",
        "X_train = X_train/255\n",
        "X_test = X_test/255"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Q3FY9FCrIjtX",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 716
        },
        "outputId": "9c408387-514d-4f98-a92f-811bba352364"
      },
      "source": [
        "plt.figure(figsize=(12, 12))\n",
        "np.random.seed(0)\n",
        "idx = np.random.randint(0, 60000, 9)\n",
        "\n",
        "for i in range(len(idx)):\n",
        "    plt.subplot(3, 3, i+1)\n",
        "    plt.title(y_train[idx[i]])\n",
        "    grid_data = np.reshape(X_train[idx[i]], (28,28))\n",
        "    plt.imshow(grid_data, cmap='gray')\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 864x864 with 9 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V2ON54TNYNLK",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "X_train_o = X_train\n",
        "X_test_o = X_test"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LFpk2xVXVTtb",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "92257165-16e2-4191-fd15-6b92e1f8d8f2"
      },
      "source": [
        "X_train = X_train.reshape(60000, 784)\n",
        "X_test = X_test.reshape(10000, 784)\n",
        "X_train = X_train.astype('float32')\n",
        "X_test = X_test.astype('float32')\n",
        "\n",
        "# print the final input shape ready for training\n",
        "print(\"Train matrix shape\", X_train.shape)\n",
        "print(\"Test matrix shape\", X_test.shape)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Train matrix shape (60000, 784)\n",
            "Test matrix shape (10000, 784)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XkfGsNyIImrU",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "59391277-2419-427e-e96c-604882465196"
      },
      "source": [
        "# here we are having a class number for each image\n",
        "print(\"Class label of first image :\", y_train[0])\n",
        "\n",
        "# lets convert this into a 10 dimensional vector\n",
        "# ex: consider an image is 5 convert it into 5 => [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]\n",
        "# this conversion needed for MLPs \n",
        "\n",
        "Y_train = np_utils.to_categorical(y_train, 10) \n",
        "Y_test = np_utils.to_categorical(y_test, 10)\n",
        "\n",
        "print(\"After converting the output into a vector : \",Y_train[0])"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Class label of first image : 5\n",
            "After converting the output into a vector :  [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WAhsOhJLKLQz",
        "colab_type": "text"
      },
      "source": [
        "# Softmax classifier"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eqz3Wja7KjXe",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Define the Model\n",
        "model = None\n",
        "model = Sequential()\n",
        "\n",
        "model.add(Dense(10, input_dim=784, activation='softmax'))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "mzIAfUogU1xq",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "outputId": "983a5852-80d3-455d-c2e0-6bed356198d9"
      },
      "source": [
        "model.summary()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense (Dense)                (None, 10)                7850      \n",
            "=================================================================\n",
            "Total params: 7,850\n",
            "Trainable params: 7,850\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fnWGhZhYK8v-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Compile the Model\n",
        "\n",
        "model.compile(optimizer='adam', \n",
        "              loss='categorical_crossentropy', \n",
        "              metrics=['accuracy'])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4g-CYVRVLDUp",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "outputId": "e14a80f2-49e6-4f72-9352-44a9eb608bb9"
      },
      "source": [
        "# Fit the Model\n",
        "\n",
        "model.fit(X_train, Y_train, batch_size=128, epochs=10)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.6790 - accuracy: 0.8310\n",
            "Epoch 2/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.3626 - accuracy: 0.9019\n",
            "Epoch 3/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.3194 - accuracy: 0.9122\n",
            "Epoch 4/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.2995 - accuracy: 0.9170\n",
            "Epoch 5/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.2878 - accuracy: 0.9200\n",
            "Epoch 6/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.2800 - accuracy: 0.9222\n",
            "Epoch 7/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.2739 - accuracy: 0.9232\n",
            "Epoch 8/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.2690 - accuracy: 0.9254\n",
            "Epoch 9/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.2655 - accuracy: 0.9261\n",
            "Epoch 10/10\n",
            "469/469 [==============================] - 1s 2ms/step - loss: 0.2621 - accuracy: 0.9275\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x7f34201fd5c0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "53FKfOX1LGVX",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "33cbe20a-05f0-4132-aa4a-00bce48c5e3d"
      },
      "source": [
        "prediction_score = model.evaluate(X_test, Y_test, verbose=0)\n",
        "\n",
        "print('Test Loss and Test Accuracy', prediction_score)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Test Loss and Test Accuracy [0.2677675783634186, 0.9265999794006348]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Orpjq104avfu",
        "colab_type": "text"
      },
      "source": [
        "# Sigmoid Activation"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "j76HL5HUZa-u",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Define the Model\n",
        "\n",
        "model_sigmoid = None\n",
        "model_sigmoid = Sequential()\n",
        "\n",
        "model_sigmoid.add(Dense(512, input_dim=784, activation='sigmoid', kernel_initializer='glorot_normal'))\n",
        "model_sigmoid.add(Dropout(0.3))\n",
        "\n",
        "model_sigmoid.add(Dense(128, activation='sigmoid', kernel_initializer='glorot_normal'))\n",
        "model_sigmoid.add(Dropout(0.3))\n",
        "\n",
        "model_sigmoid.add(Dense(10, activation='softmax'))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "-A7icX40bdNn",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 354
        },
        "outputId": "54380eaa-ea4c-4224-cd82-d5d80d8092d7"
      },
      "source": [
        "model_sigmoid.summary()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential_1\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_1 (Dense)              (None, 512)               401920    \n",
            "_________________________________________________________________\n",
            "dropout (Dropout)            (None, 512)               0         \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 128)               65664     \n",
            "_________________________________________________________________\n",
            "dropout_1 (Dropout)          (None, 128)               0         \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 10)                1290      \n",
            "=================================================================\n",
            "Total params: 468,874\n",
            "Trainable params: 468,874\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fZ0i74GJbg3l",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Compile the Model\n",
        "\n",
        "model_sigmoid.compile(optimizer='adam', \n",
        "              loss='categorical_crossentropy', \n",
        "              metrics=['accuracy'])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "aRuJHRuPb1F6",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "outputId": "cac0ea4a-8865-41cf-cb16-a1eb82973152"
      },
      "source": [
        "# Fit the Model\n",
        "\n",
        "model_sigmoid.fit(X_train, Y_train, batch_size=128, epochs=10)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.6504 - accuracy: 0.8073\n",
            "Epoch 2/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.2874 - accuracy: 0.9148\n",
            "Epoch 3/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.2205 - accuracy: 0.9348\n",
            "Epoch 4/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.1795 - accuracy: 0.9470\n",
            "Epoch 5/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.1488 - accuracy: 0.9560\n",
            "Epoch 6/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.1275 - accuracy: 0.9624\n",
            "Epoch 7/10\n",
            "469/469 [==============================] - 1s 3ms/step - loss: 0.1094 - accuracy: 0.9675\n",
            "Epoch 8/10\n",
            "469/469 [==============================] - 2s 3ms/step - loss: 0.0970 - accuracy: 0.9711\n",
            "Epoch 9/10\n",
            "469/469 [==============================] - 2s 3ms/step - loss: 0.0875 - accuracy: 0.9734\n",
            "Epoch 10/10\n",
            "469/469 [==============================] - 2s 3ms/step - loss: 0.0782 - accuracy: 0.9761\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x7f343158f780>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PDeHlZqKb3bi",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "78fd759e-0be0-418b-863f-c5b0484c8d1c"
      },
      "source": [
        "prediction_score = model_sigmoid.evaluate(X_test, Y_test, verbose=0)\n",
        "\n",
        "print('Test Loss and Test Accuracy', prediction_score)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Test Loss and Test Accuracy [0.073416568338871, 0.9757000207901001]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VgGDtkuUdFnJ",
        "colab_type": "text"
      },
      "source": [
        "# ReLU Activation"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0Ef0StmEcmAF",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "outputId": "8527078b-4157-4da3-990a-c834b65cabf9"
      },
      "source": [
        "# Define the Model\n",
        "\n",
        "model_relu = None\n",
        "model_relu = Sequential()\n",
        "\n",
        "# FC - 512\n",
        "model_relu.add(Dense(512, input_dim=784, activation='relu', kernel_initializer='he_normal'))\n",
        "model_relu.add(BatchNormalization())\n",
        "model_relu.add(Dropout(0.3))\n",
        "\n",
        "# FC - 128\n",
        "model_relu.add(Dense(128, activation='relu', kernel_initializer='he_normal'))\n",
        "model_relu.add(BatchNormalization())\n",
        "model_relu.add(Dropout(0.3))\n",
        "\n",
        "# FC - 10\n",
        "model_relu.add(Dense(10, activation='softmax'))\n",
        "\n",
        "# Compile the Model\n",
        "\n",
        "model_relu.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "\n",
        "# Fit the Model\n",
        "\n",
        "model_relu.fit(X_train, Y_train, batch_size=128, epochs=10)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "469/469 [==============================] - 2s 5ms/step - loss: 0.2889 - accuracy: 0.9126\n",
            "Epoch 2/10\n",
            "469/469 [==============================] - 2s 5ms/step - loss: 0.1336 - accuracy: 0.9600\n",
            "Epoch 3/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.1050 - accuracy: 0.9679\n",
            "Epoch 4/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0845 - accuracy: 0.9742\n",
            "Epoch 5/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0737 - accuracy: 0.9764\n",
            "Epoch 6/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0659 - accuracy: 0.9783\n",
            "Epoch 7/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0575 - accuracy: 0.9815\n",
            "Epoch 8/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0527 - accuracy: 0.9827\n",
            "Epoch 9/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0487 - accuracy: 0.9846\n",
            "Epoch 10/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0444 - accuracy: 0.9855\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x7f3431d0dbe0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 25
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iOBORMeidtvg",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "d8e47a2d-4a98-4c8e-c327-d53f4f5f04fc"
      },
      "source": [
        "prediction_score = model_relu.evaluate(X_test, Y_test, verbose=0)\n",
        "\n",
        "print('Test Loss and Test Accuracy', prediction_score)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Test Loss and Test Accuracy [0.06081930547952652, 0.9810000061988831]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KVA5UBgRX328",
        "colab_type": "text"
      },
      "source": [
        "# Flatten"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Iw9rDQbUX5oS",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "f41ea6c1-e54a-4c89-f221-30b6f92c8faf"
      },
      "source": [
        "print(X_train_o.shape, X_test_o.shape)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(60000, 28, 28) (10000, 28, 28)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "C8phIORLX7P8",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "outputId": "b0b70b1b-d4ff-4275-e3b3-889ef1c05e8d"
      },
      "source": [
        "# Define the Model\n",
        "\n",
        "model_relu_flat = None\n",
        "model_relu_flat = Sequential()\n",
        "\n",
        "# Flatten\n",
        "model_relu_flat.add(Flatten(input_shape=(28, 28)))\n",
        "\n",
        "# FC - 512\n",
        "model_relu_flat.add(Dense(512, activation='relu', kernel_initializer='he_normal'))\n",
        "model_relu_flat.add(BatchNormalization())\n",
        "model_relu_flat.add(Dropout(0.3))\n",
        "\n",
        "# FC - 128\n",
        "model_relu_flat.add(Dense(128, activation='relu', kernel_initializer='he_normal'))\n",
        "model_relu_flat.add(BatchNormalization())\n",
        "model_relu_flat.add(Dropout(0.3))\n",
        "\n",
        "# FC - 10\n",
        "# Softmax\n",
        "model_relu_flat.add(Dense(10, activation='softmax'))\n",
        "\n",
        "# Compile the Model\n",
        "\n",
        "model_relu_flat.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "\n",
        "# Fit the Model\n",
        "\n",
        "model_relu_flat.fit(X_train_o, Y_train, batch_size=128, epochs=10)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.2862 - accuracy: 0.9129\n",
            "Epoch 2/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.1347 - accuracy: 0.9585\n",
            "Epoch 3/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.1024 - accuracy: 0.9684\n",
            "Epoch 4/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0839 - accuracy: 0.9740\n",
            "Epoch 5/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0746 - accuracy: 0.9773\n",
            "Epoch 6/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0648 - accuracy: 0.9788\n",
            "Epoch 7/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0588 - accuracy: 0.9810\n",
            "Epoch 8/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0518 - accuracy: 0.9831\n",
            "Epoch 9/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0468 - accuracy: 0.9848\n",
            "Epoch 10/10\n",
            "469/469 [==============================] - 2s 4ms/step - loss: 0.0427 - accuracy: 0.9859\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x7f33d4033c88>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 30
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "t5BGYxPja-BC",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 36
        },
        "outputId": "c0704d82-b62f-45e0-8574-c35b904b91fa"
      },
      "source": [
        "prediction_score = model_relu_flat.evaluate(X_test_o, Y_test, verbose=0)\n",
        "\n",
        "print('Test Loss and Test Accuracy', prediction_score)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Test Loss and Test Accuracy [0.060686271637678146, 0.9815999865531921]\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}